package com.example.service.impl;

import com.example.mapper.DeptLogMapper;
import com.example.pojo.DeptLog;
import com.example.service.DeptLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class DeptLogServiceImpl implements DeptLogService {

    @Autowired
    private DeptLogMapper deptLogMapper;

    /**
     * 重新启动SpringBoot服务，测试删除3号部门后会发生什么？
     * - 执行了删除3号部门操作
     * - 执行了插入部门日志操作
     * - 程序发生Exception异常
     * - 执行事务回滚（删除、插入操作因为在一个事务范围内，两个操作都会被回滚）
     */
    /**
     * 然后在dept_log表中没有记录日志数据
     */
    /**
     * 接下来我们就需要来分析一下具体是什么原因导致的日志没有成功的记录。
     * - 在执行delete操作时开启了一个事务
     * - 当执行insert操作时，insert设置的事务传播行是默认值REQUIRED，表示有事务就加入，没有则新建事务
     * - 此时：delete和insert操作使用了同一个事务，同一个事务中的多个操作，要么同时成功，要么同时失败，所以当异常发生时进行事务回滚，就会回滚delete和insert操作
     */
    /**
     * 在DeptLogServiceImpl类中insert方法上，添加@Transactional(propagation = Propagation.REQUIRES_NEW)
     * Propagation.REQUIRES_NEW  ：不论是否有事务，都创建新事务  ，运行在一个独立的事务中。
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW) // 事务传播行为：不论是否有事务，都新建事务
    @Override
    public void insert(DeptLog deptLog) {
        deptLogMapper.insert(deptLog);
    }

}
